package rjh

import (
	"fmt"
)

const (
	StatusOK                = 0   // 正常
	StatusIllegalArgument   = 1   // 请求参数错误
	StatusServiceNotFound   = 2   // 请求参数错误
	StatusInvalidToken      = 3   // 令牌失效，需要登录
	StatusPermissionDeny    = 4   // 没有 API 权限
	StatusResponseSerialize = 5   // 序列化返回数据时发生错误
	StatusCustom            = 100 // 业务错误
)

type data struct {
	Extra    map[string]interface{} `json:"extra,omitempty"`
	Response map[string]interface{} `json:"response"`
}

// RjResponse http 返回信息
type RjResponse struct {
	Error      error  `json:"-"`      // 原始错误信息
	Status     int    `json:"status"` // 0 正常 1 需要登录 2 没有权限
	StatusText string `json:"statusText,omitempty"`
	Data       data   `json:"data"`
}

// SetExtra 写入数据
func (r *RjResponse) Set(key string, data interface{}) {
	if r.Data.Extra == nil {
		r.Data.Extra = map[string]interface{}{}
	}
	r.Data.Extra[key] = data
}

// GetExtra 获取数据
func (r *RjResponse) Get(key string) (interface{}, error) {
	if r.Data.Extra != nil {
		data, ok := r.Data.Extra[key]
		if !ok {
			return nil, fmt.Errorf("key [%s] dosen't exists", key)
		}
		return data, nil
	}
	return nil, fmt.Errorf("extra is empty")
}

// RemoveExtra 删除数据
func (r *RjResponse) Remove(key string) {
	if r.Data.Extra != nil {
		delete(r.Data.Extra, key)
	}
}

// ClearExtra 清空数据
func (r *RjResponse) RemoveAll() {
	if r.Data.Extra != nil {
		r.Data.Extra = nil
	}
}
